package com.tim.soundseechina;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtil {
	/**
	 * 转换字符串第一个字符为大写.
	 * 
	 * @param str
	 *            需要转换的字符串.
	 * @return String 首字母大写的字符串.
	 */
	public static String convertFirstCharToUpper(String str) {
		char first = Character.toUpperCase(str.charAt(0));
		return first + str.substring(1);
	}

	/**
	 * 转换字符串第一个字符为小写.
	 * 
	 * @param str
	 *            需要转换的字符串.
	 * @return String 首字母小写的字符串.
	 */
	public static String convertFirstCharToLower(String str) {
		char first = Character.toLowerCase(str.charAt(0));
		return first + str.substring(1);
	}

	public static String getStringFromPattern(String content, String patternStr) {
		try {
			Pattern pattern = Pattern.compile(patternStr,
					Pattern.CASE_INSENSITIVE | Pattern.DOTALL
							| Pattern.UNIX_LINES);
			Matcher mt = pattern.matcher(content);
			if (mt != null && mt.find()) {
				String value = mt.group(1);
				return value;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static List<String> getListFromPattern(String content,
			String patternStr) {
		try {
			Pattern pattern = Pattern.compile(patternStr,
					Pattern.CASE_INSENSITIVE | Pattern.DOTALL
							| Pattern.UNIX_LINES);
			Matcher mt = pattern.matcher(content);
			if (mt != null) {
				List<String> list = new ArrayList<String>();
				while (mt.find()) {
					String value = mt.group(1);
					list.add(value);
				}
				return list;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 替换敏感词.
	 * 
	 * @param content
	 *            被检测内容.
	 * @param sensitivity
	 *            敏感词.
	 */
	public static String replaceSensitivity(String content, String sensitivity) {
		StringBuilder expr = new StringBuilder("");
		for (int i = 0; i < sensitivity.length(); i++) {
			expr.append(sensitivity.charAt(i) + "\\s*");
		}
		Pattern pattern = Pattern.compile(expr.toString());
		Matcher matcher = pattern.matcher(content);
		return matcher.replaceAll("***");
	}

	/**
	 * 转换字符串入文件.
	 * 
	 * @param content
	 *            文件内容.
	 * @param path
	 *            文件路径.
	 * @return boolean 是否转换成功.
	 */
	public static boolean convertToFile(String content, String path) {
		File file = new File(path);
		File parent = file.getParentFile();
		if (!parent.exists()) {
			parent.mkdirs();
		}
		try {
			file.createNewFile();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return convertToFile(content, file);
	}

	/**
	 * 将指定内容写入指定文件.
	 * 
	 * @param content
	 *            文件内容.
	 * @param file
	 *            文件.
	 * @return boolean 是否写入成功.
	 */
	public static boolean convertToFile(String content, File file) {
		try {
			OutputStream fos = new FileOutputStream(file);
			fos.write(content.getBytes());
			fos.flush();
			fos.close();
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 以指定字符集方式加载指定文件为字符串.
	 * 
	 * @param filePath
	 *            文件完整路径.
	 * @param encoding
	 *            字符集.
	 * @return String 文件字符串内容.
	 */
	public static String fileToString(String filePath, String encoding) {
		File file = new File(filePath);
		return fileToString(file, encoding);
	}

	/**
	 * 以指定字符集方式加载指定文件为字符串.
	 * 
	 * @param file
	 *            指定文件.
	 * @param encoding
	 *            字符集.
	 * @return String 文件内容.
	 */
	public static String fileToString(File file, String encoding) {
		if (file.exists()) {
			try {
				FileInputStream inputStream = new FileInputStream(file);
				byte[] data = new byte[inputStream.available()];
				inputStream.read(data);
				return new String(data, encoding);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return "";
	}

	/**
	 * 以UTF-8方式加载指定文件为字符串.
	 * 
	 * @param file
	 *            指定文件.
	 * @param encoding
	 *            字符集.
	 * @return String 文件内容.
	 */
	public static String fileToString(File file) {
		return fileToString(file, "UTF-8");
	}

	/**
	 * 以UTF-8方式加载指定文件为字符串.
	 * 
	 * @return String 文件字符串内容.
	 */
	public static String fileToString(String filePath) {
		return fileToString(filePath, "UTF-8");
	}

	/**
	 * 替换xml<标签>，会将<tagName* ..></tagName*>都替换掉留下标签内内容.
	 * 默认会将以tagName开头的标签都替换为空字符串.
	 * 
	 * @param content
	 *            字符串内容.
	 * @param tagName
	 *            标签名.
	 * @param bool
	 *            是否清除标签内属性内容.
	 * 
	 * @return String 被全部替换掉的标签内容.
	 */
	public static String replaceTag(String content, String tagName, boolean bool) {
		StringBuilder temp = new StringBuilder();
		if (!tagName.startsWith("<")) {
			tagName = "<" + tagName;
		}
		String[] tempArr = content.split(tagName);
		for (int i = 0; i < tempArr.length; i++) {
			if (i == 0) {
				temp.append(tempArr[i]);
				continue;
			}
			String expStr = ">(.*)";
			if (!bool) {
				temp.append(tagName);
				expStr = "(>.*)";
			}
			String tempStr = StringUtil
					.getStringFromPattern(tempArr[i], expStr);
			temp.append(tempStr);
		}
		if (temp.length() != 0) {
			if (tagName.startsWith("</") || !bool) {
				return temp.toString();
			} else {
				return replaceTag(temp.toString(), tagName.replace("<", "</"),
						bool);
			}
		}
		return content;
	}
}
